--分页存储过程

--创建分页包PagingPack，声明游标
create or replace package paging_pack is
--声明游标类型
type page_tb_cursor is ref cursor ;
end;
/

--创建分页过程
--需要传入的参数
--tableName需要分页查询的表名称
--firstPage起始页
--pageRow每页显示多少条记录
--返回的数据
--总记录数
--总页数
--数据
create or replace procedure p_paging(
  table_name in varchar2,
  first_page in number,
  page_row in number,
  total_record out number,
  total_page out number,
  page_list_record out paging_pack.page_tb_cursor
) is
  
  --定义SQL语句
  page_sql varchar2(1000) ;
  --定义变量，计算起始页
  page_begin number:=(first_page-1) * page_row + 1 ;
  --定义变量，计算到哪行结束
  page_end number:=first_page * page_row ;
    
begin
  page_sql:='select *from (select t1.*,rownum rn from (select *from '||table_name||') t1 where rownum<='||page_end||') where rn>='||page_begin;
  
  open page_list_record for page_sql ;
  
  --查询总记录数SQL语句
  page_sql:='select count(*) from '||table_name ;
  --动态查询总记录数，并复制给total_record
  execute immediate page_sql into total_record ;
  
  --计算总页数
  if mod(total_record,page_row)=0 then
    total_page:=total_record / page_row;
  else
    total_page:=(total_record / page_row) + 1 ;
  end if ;
  
end ;
/
